home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / stu_main.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  49KB  |  1,952 lines

  1. /*
  2.  * StuMain.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  *    Gestion du bureau
  7.  *    - Main()
  8.  *    
  9.  *    Gestion des erreurs
  10.  *    - erreur(): Signale les erreurs fatales    
  11.  *    - erreur_rsrc(): Appelle erreur() avec texte constant
  12.  *
  13.  * Suggest:
  14.  * --------
  15.  * Sortir les fonctions de drag&drop vers un module independant
  16.  * Il y a des variables privées en G_xxxx -> M_xxx
  17.  *
  18.  * History:
  19.  * --------
  20.  * 1993: fplanque: Created
  21.  */
  22.  
  23.  
  24.      #include "!OPTIONS.H"                /* Options de compilation */         
  25.     #define    THIS_FILE    "STUMAIN.C v1.00 - 02.95"
  26.           
  27.  
  28. /*
  29.  * System headers:
  30.  */
  31.     #include    <stdio.h>                    /* header standard */
  32.     #include    <stdlib.h>                    /* header librairie de fnct std */
  33.     #include <string.h>                    /* header tt de chaines */
  34.     #include    <aes.h>                        /* header AES */
  35.     #include <vdi.h>                        /* header VDI */
  36.     #include    <tos.h>                        /* Malloc pour ?FREEMEM */
  37.     #include <stdarg.h>                    /* Arguments variables */
  38.    
  39.  
  40. /*
  41.  * Custom headers:
  42.  */
  43.     #include    "SPEC_PU.H"
  44.     #include "S_MALLOC.H"
  45.     #include "AESDEF.H"                    /* Defs suppl‚mentaires pour gestion AES */
  46.     #include    "EXFRM_PU.H"
  47.     #include    "PROGR_PU.H"
  48.     #include "ARBKEYPU.H"
  49.     #include "ATREE_PU.H"
  50.     #include "ARBPG_PU.H"
  51.     #include    "CONFG_PU.H"
  52.     #include "DATAGRPS.H"    
  53.     #include "DTDIR_PU.H"    
  54.     #include "DATPG_PU.H"    
  55.     #include "DBSYS_PU.H"
  56.     #include    "DEBUG_PU.H"    
  57.     #include    "DESK_PU.H"
  58.     #include    "FILES_PU.H"
  59.     #include "MAIN_PU.H"    
  60.     #include "MMENU_PU.H"    
  61.     #include    "OBJCT_PU.H"    
  62.     #include    "PGECR_PU.H"
  63.     #include    "RAMSL_PU.H"
  64.     #include    "RTERR_PU.H"
  65.     #include "SRIAL_PU.H"
  66.     #include    "SERV_PU.H"
  67.     #include "STUT_ONE.RSC\STUT_3.H"                    /* noms des objets ds le ressource */
  68.     #include    "TEXT_PU.H"
  69.     #include    "ACCENTPU.H"
  70.     #include "VDI_PU.H"
  71.     #include    "WIN_PU.H"
  72.     #include    "WINDR_PU.H"
  73.     #include    "GEMEV_PU.H"
  74.     #include "GEMDIRPU.H"
  75.         
  76.     /* #include    "TOSERROR.H"                /* Def des erreurs TOS: NON UTILISEES */
  77.  
  78. /*
  79.  * ------------------------ PROTOTYPES -------------------------
  80.  */
  81.  
  82. /*
  83.  * PRIVate INTernal prototypes:
  84.  */
  85.     static    WIPARAMS    * wi_params ( int handle );
  86.     static    OBJECT    * window_clic( WIPARAMS *wi_params_adr, int mouse_x, int mouse_y );
  87.     static    int    drag_icon( int start_x, int start_y, int new_x, int new_y );
  88.     static    void     mouvement( int destination );
  89.     static    void    graf_beginmove( OBJECT *srce_tree, OBJECT *srce_adr, int destination, OBJECT *dest_adr );
  90.     static    void    graf_endmove( OBJECT *srce_tree, int source, OBJECT *srce_adr, int destination, OBJECT *dest_adr );
  91.    
  92. /*
  93.  * ------------------------ VARIABLES -------------------------
  94.  */
  95.     
  96.     
  97. /*
  98.  * Public variables: 
  99.  */
  100.     int        G_ap_id;                        /* Identification par l'AES */
  101.     unsigned    G_version_aes;                /* Version AES */
  102.     int        G_x_mini, G_y_mini;        /* Coord sup gauche de l'‚cran */
  103.     int        G_w_maxi, G_h_maxi;        /* Taille de l'‚cran de travail */
  104.     int        G_wx_mini, G_wy_mini;    /* Dimensions maximales d'une */
  105.     int        G_ww_maxi, G_wh_maxi;    /* fenˆtre complŠte */
  106.     int        G_n_ScreenW, G_n_ScreenH;    /* Taille ‚cran */
  107.     
  108.     WIPARAMS    *G_wi_list_adr;            /* Adresse de l'arbre de paramŠtres */
  109.     int        G_top_wi_handle;            /* Fenˆtre g‚r‚e par le programme
  110.                                                     la plus en haut, mais pouvant ˆtre
  111.                                                     surpass‚e par un accessoire */
  112.     
  113.     /*
  114.      * ParamŠtres de la "Fenˆtre" dans laquelle 
  115.      * se trouve la s‚lection actuelle:
  116.       */
  117.     WIPARAMS    *G_selection_adr = NULL;    
  118.     
  119.     int        G_ev_mgpbuff[32];            /* Buffer d'‚venements GEM (normalement, ‡a ne fait que 8 mais bon, ‡a pourrait monter ds prochainesversions AES) */
  120.     int        G_mouse_x,G_mouse_y;        /* Coordonn‚es souris (Evt_multi) */
  121.     int        G_mouse_button;            /* Etat des boutons (Evt_multi) */            
  122.     int        G_kbd_state;                /* Etat des touches sp‚ciales... */
  123.     int        G_kbd_return;                /* Scan code touche... */
  124.     int        G_mouse_nbc;                /* Nombre de cliks ... */
  125.     
  126.     int        G_fin =0;                        /* Non nul si G_fin du prg demand‚e */
  127.  
  128. /*
  129.  * Private variables: 
  130.  */
  131.     /* 
  132.      * Ressource: 
  133.      */
  134.     static    OBJECT *    M_apropos_adr;    /* Ptr sur boite d'infos */
  135.      
  136.  
  137. /*
  138.  * ------------------------ FUNCTIONS -------------------------
  139.  */
  140.  
  141. /*
  142.  * main(-)
  143.  *
  144.  * Purpose:
  145.  * --------
  146.  * Programme principal
  147.  *
  148.  * History:
  149.  * --------
  150.  * 1992: fplanque: Created
  151.  * 25.05.94: chang‚ l'ordre de traitement des messages: ordre d‚croissant des bits ds ev_mflags
  152.  * 25.05.94: inlus gestion du clavier
  153.  * 13.10.94: invers‚ orde d'appel init VDI et d‚termination taille ‚cran; contr“le d'un taille minimale
  154.  * 02.02.95: init arbo APRES init bureau
  155.  */
  156. int main(void)
  157. {
  158.     int    event;                            /* Evenements d‚tect‚s par Evt_multi */
  159.  
  160.     char * ptr;
  161.  
  162.    /*
  163.     * Positionnement curseur VT52 en haut de l'‚cran:
  164.     * Passage … la ligne automatique:
  165.     */
  166.     printf("\33Y!#\33v\n"); 
  167.  
  168. /* #define    DBGBOOT(x)        printf( x ); /* getchar(); */
  169. #define    DBGBOOT(x)
  170.  
  171.     DBGBOOT( "Boot-Up Debug is Active\n" )
  172.  
  173.     /*
  174.      * test du debug des malloc
  175.      */
  176.     ptr = MALLOC( 10 );
  177.     ptr = REALLOC( ptr, 20 );
  178.     FREE(ptr);
  179.  
  180.     /*
  181.      * Init des routines sp‚ciales FP:
  182.      */
  183.     Special_Init();
  184.  
  185.     /*
  186.      * D‚claration du programme … l'AES 
  187.      */
  188.     G_ap_id=appl_init();
  189.     if (G_ap_id == -1)
  190.         erreur( "[3][L'application courante|"
  191.                         "ne peut ˆtre d‚clar‚e|"
  192.                         "auprŠs du systŠme|"
  193.                         "d'exploitation!]"
  194.                         "[Quitter|Continuer]");
  195.  
  196.     /*
  197.      * R‚cupŠre version AES: 
  198.      */
  199.     G_version_aes = _GemParBlk .global[ 0 ];
  200.  
  201.     /*
  202.      * Init des fonctions de debug:
  203.      */
  204.     debug_Construct();
  205.  
  206.     /*
  207.      * Transmet nom de l'application … l'AES pour le Menu "DESK" 
  208.      */
  209.     DBGBOOT( "Transmet nom appli … l'AES\n" )
  210.     if ( G_version_aes >= 0x0400 )
  211.     {    /*
  212.          * Sous AES 4.0 uniquement: 
  213.          */
  214.         menu_register( G_ap_id, STUT_REGISTERNAME );
  215.     }
  216.     
  217.     /*
  218.      * Initialisation "al‚atoire" du GNA 
  219.      *****************************************************
  220.      * HYPER-MEGA-IMPORTANT: SI VOUS OUBLIEZ DE FAIRE CA,
  221.      * LE RESEAU RISQUE DE SE RETROUVER AVEC PLUSIEURS
  222.      * MESSAGES AYANT LE MEME NUMERO... DEBROUILLEZ VOUS
  223.      * POUR ETRE SUR QUE VOTRE GNA N'EST PAS INITIALISE A
  224.      * LA MEME POSITION QUE CHEZ VOTRE VOISIN!!!
  225.      *****************************************************
  226.      */
  227.     srand( (unsigned int) clock() ); 
  228.  
  229.     TRACE0( "Initializing modules..." );
  230.     
  231.     /*
  232.      * D‚termination de la taille de l'‚cran 
  233.      */
  234.     wind_get(0 ,WF_WORKXYWH , &G_x_mini, &G_y_mini, &G_w_maxi, &G_h_maxi);
  235.     /*
  236.      * Contr“le la taille de l'‚cran:
  237.      */
  238.     if( G_x_mini + G_w_maxi < MIN_WIDTH || G_y_mini + G_h_maxi < MIN_HEIGHT )
  239.     {
  240.         erreur( "[3][|"
  241.                         "Stut One ne fonctionne|"
  242.                         "que dans les r‚solutions|"
  243.                         "sup‚rieures ou ‚gales …:|"
  244.                         MIN_RES_STRING  ".]"
  245.                         "[ Quitter ]");
  246.     }
  247.  
  248.     /*
  249.      * D‚termination de la zone de travail maxi d'une fenˆtre complete: 
  250.      */
  251.     wind_calc( WC_WORK, COMPLETE, G_x_mini, G_y_mini, G_w_maxi, G_h_maxi,
  252.                  &G_wx_mini, &G_wy_mini, &G_ww_maxi, &G_wh_maxi );
  253.     /*
  254.      * Taille ‚cran: 
  255.      * Pas de -1, sinon on a des trucs genre 639 * 399
  256.      */
  257.     G_n_ScreenW = G_x_mini + G_w_maxi;
  258.     G_n_ScreenH = G_y_mini + G_h_maxi;
  259.  
  260.  
  261.     /*
  262.      * Ouverture d'une station de travail virtuelle VDI sur ‚cran 
  263.      */
  264.     DBGBOOT( "Init VDI\n" )
  265.     init_vdi();
  266.  
  267.     /*
  268.      * Chargement du fichier ressource 
  269.      */
  270.     DBGBOOT( "Charge RSC\n" )
  271.     Dsetpath( "STUT_ONE.RSC" );
  272.     if( rsrc_load( "STUT_3.RSC" ) == 0)
  273.     {
  274.         erreur("[3][|Le fichier RSC|"
  275.                         "ne peut ˆtre charg‚!]"
  276.                         "[Quitter|Continuer]");
  277.     }
  278.     DBGBOOT( "Charg‚ RSC\n" )
  279.     Dsetpath( ".." );
  280.  
  281.     /*
  282.      * D‚termination des adresses ressource:
  283.      */
  284.     if( rsrc_gaddr( R_TREE, APROPOS, &M_apropos_adr) == 0)
  285.         erreur_rsrc();
  286.     rsrc_color( M_apropos_adr );        /* Fixe couleurs */
  287.     /*
  288.      * Fixe nom du logiciel:
  289.      */
  290.     dlink_teptext( &M_apropos_adr[PRGNAME], STUT_FULLNAME );
  291.     dlink_teptext( &M_apropos_adr[RELEASE], STUT_RELEASEINFO );
  292.  
  293.     /*
  294.      * Init traitement des textes:
  295.      */
  296.     init_text();
  297.  
  298.     /*
  299.      * Init gestion des PopUps:
  300.      */
  301.     PopUp_Init(); 
  302.      
  303.     /*
  304.      * Init menu ppal:
  305.      */
  306.     DBGBOOT( "Init Main Menu\n" )
  307.     init_MainMenu();
  308.  
  309.     /*
  310.      * Init prises s‚rie: 
  311.      */
  312.     DBGBOOT( "Init prises s‚rie\n" )
  313.     init_serial();
  314.     
  315.     /*
  316.      * Init des op‚rations sur les fichiers: 
  317.      */
  318.     DBGBOOT( "Init op‚rations sur fichiers\n" )
  319.     init_fsel();
  320.  
  321.     /*
  322.      * Chargement des parametres dans STUT_ver.INI: 
  323.      */
  324.     autoload_ini();
  325.     
  326.     /*
  327.      * Teste si on a charg‚ l'affectation des voies: 
  328.      */
  329.     if ( G_voies == NULL )
  330.     {    /* 
  331.          * Si on a pas charg‚ d'affectation: 
  332.          * Cr‚ation de voies par d‚faut:
  333.          */
  334.         init_voies();
  335.     }
  336.     
  337.     /* 
  338.      * Init manip des donn‚es: 
  339.      */
  340.     init_datas();
  341.  
  342.     /*
  343.      * Init S.G.B.D: 
  344.      */
  345.     init_dbsystem();
  346.  
  347.     /*
  348.      * Init des progress indicators: 
  349.      */
  350.     init_progress();
  351.  
  352.     /*
  353.      * Init du s‚lecteur RAM: 
  354.      */
  355.     init_ramselect();
  356.  
  357.     /*
  358.      * (1) Installation du bureau: 
  359.      */
  360.     DBGBOOT( "Init Desktop\n" )
  361.     init_desktop();
  362.     /*
  363.      * (2) Init des ic“nes: 
  364.      */
  365.     DBGBOOT( "Init Icons\n" )
  366.     init_icons();
  367.  
  368.     /*
  369.      * Init de l'arbre arborescence:
  370.      */
  371.     init_tree();
  372.      
  373.     /* 
  374.      * Init des pages & routines arbo: 
  375.      */
  376.     init_arbo();
  377.  
  378.     /*
  379.      * Init des objets servant … cr‚er des run-time-trees: 
  380.      */
  381.     init_objects();
  382.  
  383.     /*
  384.      * Init accents:
  385.      */
  386.     init_accents();
  387.  
  388.     /*
  389.      * Init tt des pages ‚cran:
  390.      */
  391.     init_PagesEcran();
  392.  
  393.     /*
  394.      * Init configuration: 
  395.      */
  396.     init_config();
  397.  
  398.     /*
  399.      * Init dirs:
  400.      */
  401.     Dirs_Init();
  402.  
  403.     TRACE0( "Modules' Initialization Completed" );
  404.  
  405.  
  406.     /*
  407.      * Chargement du serveur dans STUT_ver.INF: 
  408.      */
  409.     autoload_inf();
  410.  
  411.     /*
  412.      * Installation du menu 
  413.      */
  414.     menu_ienable( G_menu_adr, OUVRIR, 0 );    /* Disable */
  415.     menu_ienable( G_menu_adr, FERMER, 0 );    /* Disable */
  416.     if (menu_bar( G_menu_adr, SHOW_MENU ) == 0)    
  417.         erreur_rsrc();
  418.     
  419.     /*
  420.      * -----------------------
  421.      * Gestion des ‚vŠnements:
  422.      * -----------------------
  423.      */
  424.     do
  425.     {
  426.         graf_mouse( ARROW, 0);                /* Change curseur souris */
  427.         
  428.         event=evnt_multi( MU_MESAG | MU_BUTTON | MU_KEYBD,
  429.                                 2, 1, 1,
  430.                         0, 0, 0, 0, 0, 
  431.                         0, 0, 0, 0, 0,
  432.                         G_ev_mgpbuff, 
  433.                         0, 0,
  434.                         &G_mouse_x, &G_mouse_y, &G_mouse_button,
  435.                         &G_kbd_state, &G_kbd_return,
  436.                         &G_mouse_nbc);
  437.  
  438.         if( event & MU_MESAG ) 
  439.         {    /*
  440.              * ------------
  441.               * Message AES:
  442.               * ------------ 
  443.               */
  444.  
  445.             int    msg_type= G_ev_mgpbuff[0];    /* Type de message */
  446.             int    wi_handle=-1;            /* Handle de la fenˆtre … traiter */
  447.             WIPARAMS    *wi_params_adr;    /* Adresse des params de la fen concern‚e */
  448.  
  449.             if ( msg_type>=WM_REDRAW && msg_type<=WM_NEWTOP ) /* Si event concerne une fenˆtre */
  450.             {
  451.                 wi_handle= G_ev_mgpbuff[3];    /* Handle de la fenˆtre … traiter */
  452.  
  453.                 wi_params_adr = wi_params ( wi_handle );  /* Adr de la zone de paramŠtres associ‚e */
  454.                 if ( wi_params_adr == NULL )    
  455.                 {    /* Si la fen concern‚ n'existe pas(plus) */
  456.                     msg_type = -1;        /* Annule le message: il ne sera pas reconnu par ce qui suit... */                            
  457.                 }
  458.             }
  459.                 
  460.             switch ( msg_type )
  461.             {
  462.  
  463.                 case MN_SELECTED:
  464.                     selection_menu( G_ev_mgpbuff[3], G_ev_mgpbuff[4] );
  465.                     break;
  466.  
  467.                 case WM_REDRAW:
  468.                     redraw( wi_params_adr, G_ev_mgpbuff[4], G_ev_mgpbuff[5],
  469.                         G_ev_mgpbuff[6], G_ev_mgpbuff[7], TAKE_CTRL ); /* Effectue un redraw */
  470.                     break;
  471.  
  472.                 case WM_TOPPED:
  473.                     put_wi_on_top( wi_params_adr );    /* Place fen au premier plan */
  474.                     break;
  475.  
  476.                 case WM_CLOSED:
  477.                     ferme_fenetre( wi_params_adr, TRUE_1 );
  478.                     break;
  479.             
  480.                 case WM_FULLED:
  481.                     msg_fulled( wi_params_adr );
  482.                     break;
  483.                     
  484.                 case WM_ARROWED:
  485.                     msg_arrowed( wi_params_adr );
  486.                     break;
  487.                     
  488.                 case WM_VSLID:
  489.                     msg_vslid( wi_params_adr );
  490.                     break;
  491.  
  492.                 case WM_HSLID:
  493.                     msg_hslid( wi_params_adr );
  494.                     break;
  495.                 
  496.                 case WM_SIZED:
  497.                     msg_sized( wi_params_adr );
  498.                     break;
  499.  
  500.                 case WM_MOVED:
  501.                     msg_moved( wi_params_adr );
  502.                     break;
  503.  
  504.                 case WM_NEWTOP:
  505.                     ping();
  506.                     /* Cet ‚vŠnement n'arrive jamais et c'est dommage! */
  507.                     put_wi_on_top( wi_params_adr );    /* Place fen au premier plan */
  508.                     break;
  509.             }
  510.         }
  511.  
  512.  
  513.         if( event & MU_BUTTON )
  514.         {    /*
  515.              * -------------
  516.              * Click souris: 
  517.              * -------------
  518.              */
  519.  
  520.             int        wi_handle;            /* Handle de la fenˆtre cliqu‚e */
  521.             OBJECT    *obj_adr = NULL;    /* Pointe sur Objet sur lequel on a cliqu‚ */
  522.             WIPARAMS    *wi_params_adr;    /* Adr des params de la fen ds laquelle on a cliqu‚ */
  523.             
  524.             /* wind_update( BEG_MCTRL );    /* App prend en charge souris */
  525.             /* Pourquoi donc ? */
  526.             /* 15/07/93 En fait c peut etre justifi‚ pour le drag & drop: */
  527.             /* Il ne faudrait pas qu'un fenetre vienne se mettre au premier plan entre */
  528.             /* le moment ou on a cliqu‚ et celui o— on commence le d‚placement! */
  529.  
  530.             /*
  531.              * Handle de la fen ds laquelle on a cliqu‚: 
  532.              */
  533.             wi_handle= wind_find( G_mouse_x, G_mouse_y );
  534.             /*
  535.              * ParamŠtres associ‚s: 
  536.              */
  537.             wi_params_adr = wi_params( wi_handle );
  538.  
  539.             if ( wi_handle == 0)            /* Si on a cliqu‚ sur le bureau */
  540.             {
  541.                 obj_adr = window_clic( G_desk_params_adr, G_mouse_x, G_mouse_y );                        
  542.             }
  543.             else                                /* Si pas cliqu‚ sur le bureau */
  544.             {
  545.                 /*
  546.                  * Selon le type de fenˆtre: 
  547.                  */
  548.                 switch( wi_params_adr -> type )
  549.                 {    /* 
  550.                      * But: d‚tecter les fenˆtres "cliquables" 
  551.                      */
  552.                     case    TYP_TREE:
  553.                         /*
  554.                          * Fixe la position de l'arbre pour bien interpreter le clic: 
  555.                          */
  556.                         fixform_window( wi_params_adr );
  557.                     case    TYP_ARBO:
  558.                     case    TYP_DIR:
  559.                         obj_adr = window_clic( wi_params_adr, G_mouse_x, G_mouse_y );
  560.                         break;
  561.                 }
  562.             }
  563.  
  564.             if ( obj_adr != NULL )
  565.             {    /*
  566.                  * Si un objet est s‚lectionn‚: 
  567.                  * Type r‚el sans les bits ‚tendus 
  568.                  */
  569.                 int    real_type = (obj_adr -> ob_type) & 0x00FF;
  570.  
  571.                 /*
  572.                  * Selon action utilisateur: 
  573.                  */
  574.                 if ( G_mouse_nbc==2 )
  575.                 {     /* 
  576.                      * Si on a double cliqu‚ 
  577.                      */
  578.                     if ( obj_adr -> ob_flags & OUVRABLE  &&  !( obj_adr -> ob_state & DISABLED ) )
  579.                     {    /* ...ic“ne ouvrable */
  580.                         /* wind_update( END_MCTRL );            /* AES peut reprendre la souris */
  581.                         /* Forme souris: */
  582.                         graf_mouse( BUSYBEE, NULL );
  583.                         /*
  584.                          * "Ouvre ic“ne": 
  585.                          */
  586.                         ouverture();                        
  587.                     }
  588.                 }
  589.                 else    if ( real_type == G_ICON || real_type == G_IMAGE )     /* S'il s'agit d'une ic“ne/image: */
  590.                 {    /*
  591.                      * Peut ˆtre un DRAG 
  592.                      */
  593.                     int    new_bstate, new_x, new_y;
  594.                     int    G_kbd_state, G_kbd_return, G_mouse_nbc;    /* Non utilis‚s */
  595.                     int    destination;                /* Objet destination */
  596.  
  597.                     /*
  598.                      * Teste ‚tat des boutons de la souris: 
  599.                      */
  600.                         /* Appel de l'AES pdt 1 milliseconde... */
  601.                         evnt_multi( MU_TIMER,
  602.                                         0, 1, 1,            /* 0 Clicks */
  603.                                         0, 0, 0, 0, 0,
  604.                                         0, 0, 0, 0, 0,
  605.                                         G_ev_mgpbuff,
  606.                                             1, 0,                /* Attend 1 milliseconde! */
  607.                                         &new_x, &new_y, &new_bstate,
  608.                                         &G_kbd_state, &G_kbd_return,
  609.                                         &G_mouse_nbc );
  610.  
  611.                         /* M‚thode de test par le VDI: ‡a fonctionne mais je */  
  612.                         /* la soup‡onne de bloquer le GEM … un moment ou un autre */
  613.                         /* Je pense qu'il faut ‚viter de m‚langer AES et VDI pour la */
  614.                         /* gestion de la souris... peut ˆtre que cel… entraŒne un */
  615.                         /* d‚faut de mise … jour des variables internes de l'AES... */
  616.                         /* vq_mouse( G_ws_handle, &new_bstate, &new_x, &new_y );*/
  617.                         /* printf("Boutons: %d \n", new_bstate); */
  618.                         /* 04/08/93: Je pense avoir r‚solu le problŠme, il provenait */
  619.                         /* apparemment de la d‚tection d'objets lorsqu'on sortait du bureau */
  620.                         /* pour aller dans la barre de menu (‡a renvoyait -1!) */
  621.                         /* On devrait pouvoir reprendre la m‚thode VDI, plus rapide? */
  622.  
  623.                         /* 
  624.                          * Teste s'il faut entamer un DRAG: 
  625.                          */
  626.                         if ( new_bstate & 1 )
  627.                         {    /*
  628.                               * Si bouton gauche press‚: */
  629.                             /* Selon le type de fenˆtre: */
  630.                             switch( wi_params_adr -> type )
  631.                             {
  632.                                 case    TYP_TREE:    /* Arborescence */
  633.                                     move_arbo( wi_params_adr, G_mouse_x, G_mouse_y );
  634.                                     break;
  635.  
  636.                                 default:
  637.                                     destination = drag_icon( G_mouse_x, G_mouse_y, new_x, new_y );
  638.                                     if ( destination != -1 )
  639.                                         mouvement( destination );
  640.                             }
  641.                         }
  642.                 }
  643.             }
  644.             /* wind_update( END_MCTRL );            /* AES peut reprendre la souris */
  645.         }
  646.  
  647.  
  648.         if( event & MU_KEYBD )
  649.         {    /*
  650.              * ---------------
  651.              * Action clavier: 
  652.              * ---------------
  653.              */
  654.             int    n_ScanCode    = G_kbd_return >> 8;
  655.             char    c_car            = G_kbd_return & 0xFF;            
  656.  
  657.             if( (G_kbd_state & 0xFFFC) == 0 
  658.                 || ! handle_keypress( G_kbd_state, n_ScanCode, c_car ))
  659.             {    /*
  660.                  * Si Ctrl ou Alt n'‚taient pas press‚s
  661.                  * ou si la combinaison n'a pas ‚t‚ interpr‚t‚e comme raccourci clavier
  662.                  * La pression s'applique … la fenˆtre au top:
  663.                  */
  664.                 WIPARAMS * pWiParams_TopWin = G_wi_list_adr;
  665.  
  666.                 if( pWiParams_TopWin != NULL )
  667.                 {    /*
  668.                      * Si on a trouv‚ une fenˆtre ouverte (au top):
  669.                      */
  670.                     /* On peut v‚rifier que c'est la bonne:
  671.                      * int    n_TopWinHandle;
  672.                      *    wind_get( 0, WF_TOP, &n_TopWinHandle ); 
  673.                      */
  674.                     /* printf( "Top win handle=%d ", G_wi_list_adr -> handle ); */
  675.                     
  676.                     /*
  677.                      * Selon le type de donn‚es dans la fenˆtre:
  678.                      */
  679.                     switch( G_wi_list_adr -> type )
  680.                     {
  681.                         case    TYP_TEXT:
  682.                             /*
  683.                              * Traitement de la touche par l'‚diteur:
  684.                              */
  685.                             winEdit_ProcessKey( pWiParams_TopWin, G_kbd_state, n_ScanCode, c_car );
  686.                             break;
  687.                     }
  688.                 }
  689.             }
  690.         }
  691.  
  692.  
  693.             
  694.         /*
  695.          * Fin ‚ventuelle de la boucle sans fin: 
  696.          */
  697.     } while( G_fin == 0 );
  698.  
  699.     /*
  700.      * -----------------
  701.      * Fin du programme:
  702.      * -----------------
  703.      * Retrait du menu 
  704.      */
  705.     if (menu_bar(G_menu_adr,CLEAR_MENU) == 0)    
  706.         erreur_rsrc();
  707.  
  708.     /*
  709.      * Referme toutes les fenˆtres 
  710.      * (normalement c'est d‚j… fait, mais bon.. )
  711.      */
  712.     while (G_top_wi_handle != 0)        
  713.     {    /*
  714.          * Tant qu'on a une fenˆtre ouverte 
  715.          */
  716.         ferme_fenetre( G_wi_list_adr, FALSE0 );        /* On ferme celle du dessus */
  717.     }
  718.     
  719.     /*
  720.      * Restore prises s‚rie dans leur ‚tat initial: 
  721.      */
  722.     restore_serial();
  723.  
  724.     /*
  725.      * EnlŠve le bureau de l'application: 
  726.      */
  727.     clear_desktop();
  728.  
  729.     /*
  730.      * Effacement du fichier ressource de la m‚moire 
  731.      */
  732.     if (rsrc_free() == 0)
  733.         erreur("[1][ATTENTION: La m‚moire|du fichier RSC n'a|pas pu ˆtre lib‚r‚e!][Continuer]");
  734.  
  735.     /*
  736.      * Ferme station de travail VDI 
  737.      */
  738.     v_clsvwk( G_ws_handle );
  739.  
  740.     /*
  741.      * D‚claration de fin de programme … l'AES 
  742.      */
  743.     if (appl_exit() == 0)
  744.         erreur("[1][ATTENTION: La d‚claration|de l'application courante|n'a pas pu ˆtre annul‚e!][Continuer]");
  745.  
  746.     /*
  747.      * Affiche stats sur l'utilisation de la m‚moire
  748.      */
  749.     MEMSTAT();
  750.  
  751.     return    0;
  752. }
  753.  
  754.  
  755.  
  756. /*
  757.  * wi_params(-)
  758.  *
  759.  * Purpose:
  760.  * --------
  761.  * Recherche ParamBlock d'une fenˆtre
  762.  *
  763.  * History:
  764.  * --------
  765.  * fplanque: Created
  766.  */
  767. WIPARAMS* wi_params( int handle )
  768. {
  769.     if ( handle == 0 )
  770.     {    /* Si on demande les params du bureau: */
  771.         return    G_desk_params_adr;
  772.     }
  773.     else
  774.     {    /* SI on veut les params d'un fenˆtre= */
  775.         WIPARAMS    *wi_params_adr;
  776.     
  777.         /* On commence par le haut de la liste */
  778.         wi_params_adr=G_wi_list_adr;
  779.         while ( wi_params_adr != NULL && (wi_params_adr -> handle) != handle )        
  780.         {    /* Tant qu'on pointe pas sur la fen recherch‚e */
  781.             wi_params_adr = wi_params_adr -> next;   /* Nlle fenˆtre … tester */
  782.         }
  783.         return    wi_params_adr;
  784.         /* Il peut arriver qu'on re‡oive un message alors que la fenetre */
  785.         /* a ‚t‚ referm‚e, dans ce cas, cette fonction renvoie un pointeur NULL */
  786.     }
  787. }
  788.  
  789.  
  790.  
  791. /*
  792.  * window_clic(-)
  793.  *
  794.  * Purpose:
  795.  * --------
  796.  * Entreprend action lorsqu'on a cliqu‚ 
  797.  * dans une fenˆtre ou sur le bureau
  798.  *
  799.  * History:
  800.  * --------
  801.  * 1993: fplanque: Created
  802.  * 29.08.94: Gestion de l'item menu "D‚compile"
  803.  * 20.09.94: Gestion du menu RENAME; remodelage substanciel; correction bug sur d‚tection TYPE d'une ic“ne ARBO
  804.  * 02.02.95: corrction bug: renvoie maintenant NULL si objet cliqu‚ est disabled
  805.  */
  806. OBJECT * window_clic( 
  807.                 WIPARAMS *    wi_params_adr, 
  808.                 int             G_mouse_x, 
  809.                 int             G_mouse_y )
  810. {
  811.     /*
  812.      * Adr de la fenetre dans laquelle est (plus pour longtemps) s‚lectionn‚e l'ancienne icone: 
  813.      */
  814.     WIPARAMS    *old_selection_adr = G_selection_adr;
  815.  
  816.     /*
  817.      * No de l'ic“ne d‚j… s‚lectionn‚e ds cette "fenˆtre": 
  818.      */
  819.     int    selected_icon = wi_params_adr -> selected_icon;
  820.  
  821.     /*
  822.      * Adresse de l'arbre d'objets test‚: 
  823.      */
  824.     OBJECT    *tree_adr = wi_params_adr -> draw_ptr .tree;
  825.  
  826.     /*
  827.      * Trouve no de l'objet sur lequel on a cliqu‚: 
  828.      */
  829.     int    object= objc_find( tree_adr, 0, 5, G_mouse_x, G_mouse_y );
  830.  
  831.     /*
  832.      * Pointeur sur cet objet: 
  833.      */
  834.     OBJECT    *obj_adr = &( tree_adr[object] );
  835.  
  836.     /*
  837.      * Coordonn‚es zone de travail concern‚e 
  838.      */
  839.     int    wx, wy, ww, wh;
  840.  
  841.     /*
  842.      * V‚rifie qu'on est dans la zone de travail de la fenˆtre et que ce n'est
  843.      * pas l'AES qui n'a pas r‚agi lorsqu'on clique sur les boutons de la
  844.      * fenˆtre (‡a arrive... souvent...) 
  845.      */
  846.     wind_get( wi_params_adr -> handle, WF_WORKXYWH, &wx, &wy, &ww, &wh );
  847.     if ( G_mouse_x < wx || G_mouse_x >= wx+ww || G_mouse_y < wy || G_mouse_y >= wy + wh )
  848.     {
  849.         return NULL;        /* Ce clic est NUL! */
  850.     }
  851.  
  852.     /*
  853.      * Cas d'une ic“ne: v‚rifie qu'on est sur l'image ou le texte... 
  854.      */
  855.     if ( ((obj_adr -> ob_type) & 0x00FF) == G_ICON )
  856.     {
  857.         if ( !ctrl_icon( tree_adr, object, G_mouse_x, G_mouse_y ) )
  858.         {    /*
  859.              * Si on … seulement cliqu‚ PRES d'une ic“ne: 
  860.              */
  861.             object = objc_parent( tree_adr, object );
  862.             obj_adr = &( tree_adr[object] );
  863.         }
  864.     }
  865.     
  866.     /*
  867.      * V‚rifie s'il se passe quelque chose: 
  868.      * CaD si on ne reclique pas sur la meme ic“ne que celle d‚j… s‚lectionn‚e: 
  869.      */
  870.     if( object != selected_icon || object == 0 )
  871.     {    /*
  872.          * Il va se passer quelque chose: d‚selection et/ou s‚lection: 
  873.          */
  874.         /************************************/            
  875.         /* D‚s‚lection de l'ancienne ic“ne: */
  876.         /************************************/            
  877.         if ( old_selection_adr != NULL )
  878.         {    /*
  879.              * S'il y a d‚j… une ic“ne s‚lectionn‚e qque part: 
  880.              */
  881.             OBJECT    *old_tree = old_selection_adr -> draw_ptr.tree;    /* Atbre dans lequel se trouvait l'ancienne ic“ne s‚lectionn‚e */
  882.             int        icon = old_selection_adr -> selected_icon;
  883.             int        start_obj;            /* Objet de d‚but du r‚affichage */
  884.  
  885.             /* printf( "unsel "); */
  886.  
  887.             /*
  888.              * Teste … partir de o— il faut r‚afficher: 
  889.              */            
  890.             if (    G_cnf_cope_with_ltf == TRUE_1     /* Si on veut contourner les bugs de let'm fly */
  891.                 || old_tree[icon] .ob_type == G_IMAGE )  /* S'il s'agit d'une IMAGE */
  892.             {    /*
  893.                  * S'il faut r‚afficher l'objet en dessous de celui qui nousint‚resse: 
  894.                  */
  895.                 start_obj  = objc_parent( old_tree, icon );    /* On va aussi redessiner le parent sous l'icone */
  896.             }
  897.             else
  898.             {
  899.                 start_obj = icon;    /* On ne red‚ssine que l'ic“ne elle mˆme */
  900.             }
  901.         
  902.             /*
  903.              * R‚affiche ic“ne dans son nouvel ‚tat (d‚s‚lection): 
  904.              */
  905.             modif_icon( old_selection_adr, start_obj, icon, NORMAL, TAKE_CTRL );    /* D‚s‚lectionne l'ancienne ic“ne */
  906.             old_selection_adr -> selected_icon = 0;        /* Plus d'icone s‚lectionn‚e */
  907.         }
  908.  
  909.         /*
  910.          * **********************************
  911.          * S‚lection d'une nouvelle ic“ne:
  912.          * **********************************
  913.          */
  914.         if( obj_adr -> ob_flags & SELECTABLE  &&  !(obj_adr -> ob_state & DISABLED) )
  915.         {    /*
  916.              * Si objet s‚lectionnable: 
  917.              */
  918.             int    n_compile = 0;                /* A priori, on ne peut pas d‚compiler l'objet s‚lectionn‚ */
  919.             int    n_rename = 0;                /* A priori, on ne peut pas renommer l'objet s‚lectionn‚ */
  920.             int    start_obj;                    /* Objet de d‚but du r‚affichage */
  921.  
  922.             /* printf( "select "); */
  923.  
  924.             selected_icon = object;            /* Nouvelle ic“ne active */
  925.  
  926.             if ( G_cnf_cope_with_ltf == TRUE_1 )
  927.             {    /*
  928.                  * Si on veut contourner les bugs de let'm fly: 
  929.                  */
  930.                 start_obj  = objc_parent( tree_adr, selected_icon );    /* On va aussi redessiner le parent sous l'icone */
  931.             }
  932.             else
  933.             {
  934.                 start_obj = selected_icon;    /* On ne red‚ssine que l'ic“ne elle mˆme */
  935.             }
  936.         
  937.             /*
  938.              * Modifie l'ic“ne: 
  939.              */
  940.             modif_icon( wi_params_adr, start_obj, selected_icon, SELECTED, TAKE_CTRL);    /* S‚lectionne la nouvelle ic“ne: */
  941.             G_selection_adr = wi_params_adr;        /* VAR globale: Nlle "fen" contenant la s‚lection */
  942.  
  943.             
  944.             /*
  945.              * Sauvegarde icone selectionn‚e: 
  946.              */
  947.             wi_params_adr -> selected_icon = selected_icon;
  948.  
  949.             /*
  950.              * Disable/enable options du menu OUVRIR, ParamŠtres 
  951.              * ET Change ligne d'infos de la fenetre:
  952.              */
  953.             menu_ienable( G_menu_adr, OUVRIR, (obj_adr -> ob_flags & OUVRABLE)? 1:0 );
  954.             menu_ienable( G_menu_adr, PARAMETR, (obj_adr -> ob_flags & PARAM)? 1:0);
  955.  
  956.             switch( wi_params_adr -> class )
  957.             {
  958.                 case    CLASS_DIR:            /* Directory */
  959.                 {    /*
  960.                      * Si on a s‚lectionn‚ un objet dans un directory:
  961.                      */
  962.                     DATAPAGE    * pDataPage = page_adr_byicno( G_selection_adr -> datadir, selected_icon );
  963.                     n_rename = 1;                /* On pourra renommer l'objet en question */
  964.  
  965.                     if( pDataPage != NULL && pDataPage -> DataType == DTYP_PAGES )
  966.                     {    /*
  967.                          * Si on a s‚lectionn‚ une page ‚cran:
  968.                          * On pourra la d‚compiler:
  969.                          */
  970.                         n_compile = 1;    /* Enable menu D‚compiler */
  971.                     }
  972.     
  973.                     set_infoline( wi_params_adr, dir_infoline_selection );    /* Modifie ligne d'infos */
  974.                 }
  975.                     break;
  976.  
  977.                 case    CLASS_TREE:            /* Arborescence */
  978.                     if( ((obj_adr -> ob_type) & 0x00FF) == G_ICON )
  979.                     {    /*
  980.                          * Si on a s‚lectionn‚ une page et non pas un lien:
  981.                          * On pourra renommer l'objet en question
  982.                          */
  983.                         n_rename = 1;                
  984.                     }
  985.                     /* printf( "infoline..."); */
  986.                     set_infoline( wi_params_adr, arbo_infoline_selection );    /* Modifie ligne d'infos */
  987.                     /* printf( "ok" ); */
  988.                     break;
  989.             }
  990.  
  991.             menu_ienable( G_menu_adr, RENAME, n_rename);
  992.             menu_ienable( G_menu_adr, MENDECMP, n_compile);
  993.  
  994.         }
  995.         else 
  996.         {    /*
  997.              * Si pas d'ic“ne s‚lectionn‚e (juste une D‚s‚lection) 
  998.              */
  999.             wi_params_adr -> selected_icon = 0;            /* Pas d'ic“ne active */
  1000.             G_selection_adr = NULL;                            /* VAR globale: Plus de s‚lection */
  1001.             menu_ienable( G_menu_adr, OUVRIR, 0);        /* Disable menu OUVRIR */
  1002.             menu_ienable( G_menu_adr, RENAME, 0);        /* Disable menu RENOMMER */
  1003.             menu_ienable( G_menu_adr, MENDECMP, 0);    /* Disable menu D‚compiler */
  1004.             menu_ienable( G_menu_adr, PARAMETR, 0);    /* Disable menu "ParamŠtres" */
  1005.         }
  1006.  
  1007.  
  1008.         /*
  1009.          * Modifie la ligne d'infos de la fen qui contenait la s‚lection pr‚c‚dente: 
  1010.          */
  1011.         if (     old_selection_adr != NULL        /* S'il y avait un s‚lection */
  1012.             &&    old_selection_adr != G_selection_adr ) /* et dans une autre fen^etre que la nouvelle s‚lection */
  1013.         {
  1014.             /*
  1015.              * Restaure la ligne d'infos g‚n‚rales: 
  1016.              */
  1017.             switch( old_selection_adr -> class )
  1018.             {
  1019.                 case    CLASS_DIR:            /* Directory */
  1020.                     set_infoline( old_selection_adr, dir_infoline );    /* Modifie ligne d'infos */
  1021.                     break;
  1022.  
  1023.                 case    CLASS_TREE:            /* Arborescence */
  1024.                     set_infoline( old_selection_adr, arbo_infoline );    /* Modifie ligne d'infos */
  1025.                     break;
  1026.             }
  1027.         }
  1028.     }
  1029.  
  1030.     /*
  1031.      * Renvoie l'adresse de l'objet s‚lectionn‚: 
  1032.      */
  1033.     if( obj_adr -> ob_flags & SELECTABLE &&  !(obj_adr -> ob_state & DISABLED) )
  1034.     {    /*
  1035.           * Si objet s‚lectionnable:
  1036.           */
  1037.         return obj_adr;
  1038.     }
  1039.     else
  1040.     {    /*
  1041.          * Si pas s‚lectionnable:
  1042.          */
  1043.         return    NULL;        /* Aucun objet s‚lectionn‚ */            
  1044.     }
  1045. }
  1046.  
  1047.  
  1048.  
  1049.  
  1050. /*
  1051.  * ouverture(-)
  1052.  *
  1053.  * Purpose:
  1054.  * --------
  1055.  * 'Ouverture' d'une ic“ne
  1056.  *
  1057.  * History:
  1058.  * --------
  1059.  * 1993: fplanque: Created
  1060.  * 22.11.94: teste si selection avant d'agir
  1061.  * 12.11.94: Signale SSTATE_MODIFIED pour pages ‚cran et bases de donn‚es
  1062.  */
  1063. void ouverture( void )
  1064. {
  1065.     int    selected_object;
  1066.     
  1067.     if( G_selection_adr == NULL )
  1068.     {
  1069.         ping();
  1070.         return;
  1071.     }
  1072.     
  1073.     /* 
  1074.      * No de l'objet s‚lectionn‚: 
  1075.      */
  1076.     selected_object =    G_selection_adr -> selected_icon;
  1077.  
  1078.     switch( G_selection_adr -> type )     /* Selon le type de fenˆtre */
  1079.     {
  1080.         case    TYP_DESK:
  1081.         {
  1082.             /*
  1083.              * Num‚ro du datagroup concern‚ par l'ouverture: 
  1084.              */
  1085.             DATAGROUP    *datagroup = dgroup_adr_byiconno( selected_object );
  1086.             /*
  1087.              * On va se placer dans le Dir ppal du datagroup … ouvrir: 
  1088.              */
  1089.             DATADIR        *datadir = datagroup -> root_dir;
  1090.  
  1091.             switch ( selected_object )
  1092.             {
  1093.                 case    DSTDISK:
  1094.                     /*
  1095.                      * Cette action permet de charger un texte et
  1096.                      * de l'afficher directement! 
  1097.                      */
  1098.                     ouvre_fenetre( CLASS_TEXT, TYP_TEXT,
  1099.                                         NULL, NULL, NULL,
  1100.                                         " Texte " );
  1101.                     break;
  1102.  
  1103.                 case    DSTARBO:
  1104.                     ouvre_fenetre( CLASS_TREE, TYP_TREE,
  1105.                                         datagroup, datadir, NULL,
  1106.                                         " Arborescence " );
  1107.                     break;
  1108.                 
  1109.                 case    DSTPAGES:
  1110.                     ouvre_fenetre( CLASS_DIR, TYP_DIR,
  1111.                                         datagroup, datadir, NULL,
  1112.                                         " Pages Ecran " );
  1113.                     break;
  1114.  
  1115.                 case    DSTDATAS:
  1116.                     ouvre_fenetre( CLASS_DIR, TYP_DIR,
  1117.                                         datagroup, datadir, NULL,
  1118.                                         " Bases de Donn‚es " );
  1119.                     break;
  1120.  
  1121.                 case    DSTTEXTS:
  1122.                     ouvre_fenetre( CLASS_DIR, TYP_DIR,
  1123.                                         datagroup, datadir, NULL,
  1124.                                         " Textes " );
  1125.                     break;
  1126.  
  1127.                 case    DSTPICS:
  1128.                     ouvre_fenetre( CLASS_DIR, TYP_DIR,
  1129.                                         datagroup, datadir, NULL,
  1130.                                         " Images " );
  1131.                     break;
  1132.  
  1133.                 default:                            /* Si on a pas pu traiter la demande */
  1134.                     ping();                                /* Emmet un bip */
  1135.             }
  1136.             break;
  1137.         }
  1138.             
  1139.         case    TYP_ARBO:
  1140.         {    /*
  1141.              * Sommaire d'une page arbo:
  1142.              */
  1143.             ouverture_menu_arbo( G_selection_adr );
  1144.             break;
  1145.         }
  1146.         
  1147.         case    TYP_DIR:
  1148.         {    /*
  1149.              * Groupe de donn‚es concern‚: 
  1150.              */
  1151.             DATADIR        *    curr_datadir    = G_selection_adr -> datadir;
  1152.             DATAGROUP    *    datagroup        = G_selection_adr -> datagroup;
  1153.             DATAPAGE        *    datapage            = page_adr_byicno( curr_datadir, selected_object );
  1154.             
  1155.             switch( datagroup -> DataType )
  1156.             {
  1157.                 case    DTYP_PAGES:
  1158.                 case    DTYP_DATAS:
  1159.                 {    /*
  1160.                      * Pages ‚cran:
  1161.                      * Bases de donn‚es:
  1162.                      * Edition du commentaire
  1163.                      */
  1164.                     GRECT    GRect = { 0, 0, 0, 0 };
  1165.                     if( edit_datapage_comment( datapage, &GRect ) )
  1166.                     {    /* 
  1167.                          * Si on a modifi‚ le commentaire:
  1168.                          * Signale que la page a ‚t‚ modifi‚e:
  1169.                          */
  1170.                         dataPage_chgSavState( datapage, SSTATE_MODIFIED, TRUE_1, TRUE_1 );
  1171.                     }
  1172.                     break;
  1173.                 }
  1174.                 
  1175.                 case    DTYP_TEXTS:
  1176.                     ouvre_fenetre( CLASS_DATAPAGE, TYP_TEXT,
  1177.                                         datagroup, curr_datadir, datapage,
  1178.                                         "" );
  1179.                     break;
  1180.     
  1181.                 case    DTYP_PICS:
  1182.                     ouvre_fenetre( CLASS_DATAPAGE, TYP_PI3,
  1183.                                         datagroup, curr_datadir, datapage,
  1184.                                         "" );
  1185.                     break;
  1186.                     
  1187.                 default:
  1188.                     signale("Type de donn‚es de la fenˆtre non reconnu");
  1189.             }
  1190.             break;
  1191.         }
  1192.         
  1193.         case    TYP_TREE:            
  1194.         {    /*
  1195.              * Arborescence 
  1196.              */
  1197.             ouverture_page_arbo( G_selection_adr );
  1198.             break;
  1199.         }
  1200.                         
  1201.         default:
  1202.             ping();
  1203.     }
  1204.  
  1205.     /*
  1206.      * D‚s‚lectionne l'ic“ne qu'on vient d' "ouvrir" : 
  1207.      */
  1208.     {
  1209.         OBJECT    *tree = G_selection_adr -> draw_ptr.tree;
  1210.         int        start_obj;
  1211.         /*
  1212.          * Teste … partir de o— il faut r‚afficher: 
  1213.          */
  1214.         if (    G_cnf_cope_with_ltf == TRUE_1     /* Si on veut contourner les bugs de let'm fly */
  1215.             || tree[selected_object] .ob_type == G_IMAGE )  /* S'il s'agit d'une IMAGE */
  1216.         {    /*
  1217.              * S'il faut r‚afficher l'objet en dessous 
  1218.              * de celui qui nous int‚resse: 
  1219.              */
  1220.             start_obj = objc_parent( tree, selected_object );    /* On va aussi redessiner le parent sous l'icone */
  1221.         }
  1222.         else
  1223.         {
  1224.             start_obj = selected_object;    /* On ne red‚ssine que l'ic“ne elle mˆme */
  1225.         }
  1226.         /*
  1227.          * R‚affiche: 
  1228.          */
  1229.         modif_icon( G_selection_adr, start_obj, selected_object, NORMAL, TAKE_CTRL );
  1230.         no_selection();            /* Reset des flags */
  1231.     }
  1232. }
  1233.  
  1234.  
  1235.  
  1236. /*
  1237.  * sauver(-)
  1238.  *
  1239.  * Purpose:
  1240.  * --------
  1241.  * 'Sauvegarde' d'une ic“ne ou du contenu d'une fenˆtre
  1242.  * sur le disque
  1243.  *
  1244.  * Suggest:
  1245.  * ------
  1246.  * On devrait pouvoir sauver les debug text etc...
  1247.  *
  1248.  * History:
  1249.  * --------
  1250.  * 31.05.94: fplanque: Created
  1251.  */
  1252. void sauver( void )
  1253. {
  1254.     /*
  1255.      * teste s'il y a une s‚lection:
  1256.      */
  1257.     if( G_selection_adr == NULL )
  1258.     {    /*
  1259.          * Pas de s‚lection:
  1260.          * On va sauver le contenu de la fenˆtre au 1er plan:
  1261.          */
  1262.         if( G_wi_list_adr    != NULL )
  1263.         {    /*
  1264.              * S'il y a une fenˆtre au premier plan
  1265.              */
  1266.             switch ( G_wi_list_adr -> type )     /* Selon le type de fenˆtre */
  1267.             {
  1268.                 case    TYP_TEXT:
  1269.                     sauve_texte( G_wi_list_adr -> content_ptr.textInfo );
  1270.                     break;
  1271.                     
  1272.                 default:
  1273.                     signale("Ne sait pas sauver le contenu de cette fenˆtre" );
  1274.             }
  1275.         }
  1276.     }
  1277.  
  1278. }
  1279.  
  1280.  
  1281. /*
  1282.  * parametrage(-)
  1283.  *
  1284.  * Purpose:
  1285.  * --------
  1286.  * 'Param‚trage' d'une ic“ne
  1287.  *
  1288.  * History:
  1289.  * --------
  1290.  * fplanque: Created
  1291.  */
  1292. void parametrage ( const GRECT *start_box )
  1293. {
  1294.     /* No de l'objet s‚lectionn‚: */
  1295.         int    selected_object    =     G_selection_adr -> selected_icon;
  1296.  
  1297.     /* printf("Type de fenˆtre: %X ",G_selection_adr -> type); */
  1298.     switch ( G_selection_adr -> type )     /* Selon le type de fenˆtre */
  1299.     {
  1300.         case    TYP_DESK:
  1301.         {
  1302.             switch ( selected_object )
  1303.             {
  1304.                 case    DSTTERM:
  1305.                     /*
  1306.                      * Param‚trage Terminla:
  1307.                      */
  1308.                     param_term( start_box );
  1309.                     break;
  1310.                 
  1311.                 default:                            /* Si on a pas pu traiter la demande */
  1312.                     ping();                                /* Emmet un bip */
  1313.             }
  1314.             break;
  1315.         }
  1316.             
  1317.         default:
  1318.             ping();
  1319.     }
  1320.  
  1321. }
  1322.  
  1323.  
  1324.  
  1325. /*
  1326.  * no_selection(-)
  1327.  *
  1328.  * Purpose:
  1329.  * --------
  1330.  * Supprime toute s‚lection d'ic“ne au niveau 
  1331.  *    des flags (pas d'affichage)
  1332.  *
  1333.  * History:
  1334.  * --------
  1335.  * 1993: fplanque: Created
  1336.  */
  1337. void    no_selection( void )
  1338. {
  1339.         menu_ienable( G_menu_adr, OUVRIR, 0);            /* Disable "Ouvrir" */
  1340.         menu_ienable( G_menu_adr, RENAME, 0);            /* Disable "Renommer" */
  1341.         menu_ienable( G_menu_adr, PARAMETR, 0);        /* Disable "ParamŠtres" */
  1342.  
  1343.         G_selection_adr -> selected_icon= 0;            /* Plus d'ic“ne s‚lectionn‚e */
  1344.         G_selection_adr = NULL    ;                            /* Plus de fen o— se trouve select */
  1345. }
  1346.  
  1347.  
  1348.  
  1349. /*
  1350.  * drag_icon(-)
  1351.  *
  1352.  * Purpose:
  1353.  * --------
  1354.  * D‚placement d'une ic“ne
  1355.  *
  1356.  * History:
  1357.  * --------
  1358.  * 1993: fplanque: Created
  1359.  * 17.06.94: teste 'OVERLAPPED' plut“t que WF_TOP
  1360.  */
  1361. int    drag_icon( 
  1362.             int start_x, 
  1363.             int start_y, 
  1364.             int n_new_x, 
  1365.             int n_new_y )
  1366. {
  1367.     int    n_drag_evt;            /* EvŠnement qui s'est d‚clench‚: */
  1368.     int    n_new_bstate, n_kbd_state, n_kbd_return, n_mouse_nbc;    /* Non utilis‚s */
  1369.     int    i,j;
  1370.     int    start_obj=-1, sel_x, sel_y; /* Objet de d‚part avec coordonn‚es */
  1371.     int    offset_x , offset_y;
  1372.     int    fantome_x, fantome_y;
  1373.     int    area_x1, area_y1, area_x2, area_y2;    /* Zone de d‚placement du fant“me */
  1374.     int    n_new_handle;                    /* Handle de la "fenˆtre" o— se trouve actuellement la souris */
  1375.     int    last_spot=-1;                /* Dernier objet que l'on avait "allum‚" */
  1376.  
  1377.     /* 
  1378.      * Simule "construction ‚cran" pour empˆcher l'AES de d‚rouler ses menus: 
  1379.      * vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv 
  1380.      */
  1381.     start_WINDRAW( NULL );
  1382.     /*
  1383.      * Forme souris: 
  1384.      */
  1385.     graf_mouse( FLAT_HAND, NULL );    /* Main ouverte */
  1386.  
  1387.     /*
  1388.      * Calcule la zone ds laquelle peut se d‚placer le fant“me: 
  1389.      */    
  1390.     area_x1 = G_x_mini;
  1391.     area_y1 = G_y_mini;
  1392.     area_x2 = G_x_mini + G_w_maxi - G_icon_w;
  1393.     area_y2 = G_y_mini + G_h_maxi - G_icon_h;
  1394.  
  1395.     /* Calcule offset entre ic“ne-start et pointeur de la souris: */
  1396.     objc_offset( G_selection_adr -> draw_ptr.tree,
  1397.                      G_selection_adr -> selected_icon, &sel_x, &sel_y );
  1398.     offset_x = sel_x - start_x;
  1399.     offset_y = sel_y - start_y;
  1400.  
  1401.     /* Objet de d‚part: (slt si sur desktop) */
  1402.     if ( G_selection_adr == G_desk_params_adr )
  1403.         start_obj = G_selection_adr -> selected_icon;
  1404.  
  1405.  
  1406.     /* Fixe les paramŠtres de dessin VDI: */
  1407.     vsl_color( G_ws_handle, RED );                    /* Couleur */        
  1408.     vswr_mode( G_ws_handle, MD_XOR );                /* Mode XOR */
  1409.     vsl_type( G_ws_handle, 7 );                        /* Motif utilisateur */
  1410.         
  1411.     /*
  1412.      * Boucle de mouvement: 
  1413.      */
  1414.     do
  1415.     {    /*
  1416.           * Cherche sur quoi se trouve le pointeur de la souris: 
  1417.           */            
  1418.         n_new_handle = wind_find( n_new_x, n_new_y );
  1419.         if ( n_new_handle == 0)
  1420.         {     /*
  1421.               * Si on est sur le bureau: 
  1422.               */
  1423.             sensitive_desk( n_new_x, n_new_y, start_obj, &last_spot );
  1424.         }
  1425.         /*    else    /* Si pas sur desktop: */
  1426.         /*    printf("WIN:%d \r",n_new_handle);*/
  1427.     
  1428.         /*
  1429.          * Coordonn‚es auxquelles il faut dessiner le fant“me: 
  1430.          */
  1431.         fantome_x = n_new_x + offset_x;
  1432.         if ( fantome_x < area_x1 )
  1433.         {
  1434.             fantome_x = area_x1;
  1435.         }
  1436.         else if ( fantome_x > area_x2 )
  1437.         {
  1438.             fantome_x = area_x2;
  1439.         }
  1440.         
  1441.         fantome_y = n_new_y + offset_y;
  1442.         if ( fantome_y < area_y1 )
  1443.         {
  1444.             fantome_y = area_y1;
  1445.         }
  1446.         else if ( fantome_y > area_y2 )
  1447.         {
  1448.             fantome_y = area_y2;
  1449.         }
  1450.         
  1451.         for( i=1, j=0; i<=9; i++ )
  1452.         {
  1453.             G_pxyarray[ j ]= fantome_x + G_fantome_icone[ j++ ];
  1454.             G_pxyarray[ j ]= fantome_y + G_fantome_icone[ j++ ];
  1455.         }
  1456.         
  1457.         /*
  1458.          * Dessin du fant“me de l'ic“ne: 
  1459.          */
  1460.         draw_fantom( fantome_x, fantome_y ); 
  1461.             
  1462.         /*
  1463.          * Attend qu'il se passe qque chose: 
  1464.          */
  1465.         n_drag_evt=evnt_multi( MU_BUTTON | MU_M1,
  1466.                                 1, 1, 0,                            /* Observe le relachement du bouton gauche */
  1467.                         1, n_new_x, n_new_y, 1, 1,        /* Observe tout d‚placement de la souris */ 
  1468.                         0, 0, 0, 0, 0,
  1469.                         0L, 
  1470.                         0, 0,
  1471.                         &n_new_x, &n_new_y, &n_new_bstate,
  1472.                         &n_kbd_state, &n_kbd_return,
  1473.                         &n_mouse_nbc);
  1474.  
  1475.         /*
  1476.          * Efface le fant“me de l'ic“ne: 
  1477.          */
  1478.         draw_fantom( fantome_x, fantome_y ); 
  1479.         
  1480.     } while( n_drag_evt != MU_BUTTON );
  1481.  
  1482.     /*
  1483.      * Il faut remettre en place certains attributs de dessin: 
  1484.      */
  1485.     vswr_mode( G_ws_handle, MD_REPLACE );            /* FIN Mode XOR */
  1486.  
  1487.     /*
  1488.      * D‚s‚lectionne l'ic“ne destination: 
  1489.      */
  1490.     if ( last_spot != -1 )
  1491.     {
  1492.         modif_icon( G_desk_params_adr, last_spot, last_spot, NORMAL, CTRL_OK );    /* D‚S‚lectionne */
  1493.     }
  1494.     
  1495.     /*
  1496.      * Fin du drag 
  1497.      */
  1498.     graf_mouse(BUSYBEE, 0);            /* Change curseur souris */
  1499.     end_WINDRAW();
  1500.     /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  1501.  
  1502.     /*
  1503.      * No de l'objet sur lequel on a tir‚ l'ic“ne de d‚part 
  1504.      * -1 si aucune ou si last=start 
  1505.      */
  1506.     return    last_spot;
  1507. }
  1508.  
  1509.  
  1510.  
  1511. /*
  1512.  * mouvement(-)
  1513.  *
  1514.  * Purpose:
  1515.  * --------
  1516.  * 'Mouvement' d'une ic“ne vers une autre
  1517.  *
  1518.  * History:
  1519.  * --------
  1520.  * 1993: fplanque: Created
  1521.  * 19.06.94: gestion des groupes textes & images
  1522.  * 09.08.94: plus de redraw apres efface_1page ni aprŠs DataGrp_MergeFile, il devrait dej… etre fait ds subroutine
  1523.  * 26.12.94: ectraction du reset datagroup
  1524.  */
  1525. void mouvement( int destination )
  1526. {
  1527.     int    resultat = 0;                /* R‚sultat de l'op‚ration */
  1528.     int    n_SrcIcon     = G_selection_adr -> selected_icon; /* Ic“ne de d‚part */
  1529.  
  1530.     /* 
  1531.      * Adr ic“nes source & dest: 
  1532.      */
  1533.     OBJECT    *srce_tree    = (G_selection_adr -> draw_ptr).tree;
  1534.     OBJECT    *srce_adr    = &(G_selection_adr -> draw_ptr).tree[ n_SrcIcon ];
  1535.     OBJECT    *dest_adr    = &G_desktop_adr[ destination ];
  1536.  
  1537.     switch ( G_selection_adr -> class )     
  1538.     {    
  1539.         case    CLASS_DESK:            
  1540.             /*
  1541.              * D‚part: Bureau 
  1542.              */
  1543.             switch ( n_SrcIcon )
  1544.             {
  1545.                 case    DSTDISK:                
  1546.                 {    /* 
  1547.                      * D‚part: DISQUE 
  1548.                      */
  1549.                     switch ( destination )
  1550.                     {
  1551.                         case    DSTARBO:            /* Destination arbo */
  1552.                         {
  1553.                             DATAGROUP    *datagroup = dgroup_adr_byiconno( destination );
  1554.  
  1555.                             if( (datagroup -> root_dir) == NULL )
  1556.                             {    /* 
  1557.                                  * Si arbo vierge: ok 
  1558.                                  */
  1559.                                 graf_beginmove( srce_tree, srce_adr, destination, dest_adr );
  1560.                                 resultat= DataGrp_MergeFile( datagroup );    
  1561.                             }
  1562.                             else
  1563.                             {    /*
  1564.                                   * Si l'arbo est d‚j… occupp‚e: 
  1565.                                   */
  1566.                                 form_alert(1,"[1][|Vous ne pouvez charger|"
  1567.                                                         "une arborescence que|"
  1568.                                                         "dans un dossier vierge!]"
  1569.                                                         "[ Abandon ]");
  1570.                                 resultat = 1;
  1571.                             }
  1572.                             break;
  1573.                         }
  1574.                         
  1575.                         case    DSTPAGES:        /* Destination pages ‚cran */
  1576.                         case    DSTDATAS:        /* Destination Donn‚es */
  1577.                         case    DSTTEXTS:        /* Destination textes */
  1578.                         case    DSTPICS:            /* Destination images */
  1579.                         {
  1580.                             DATAGROUP    *datagroup = dgroup_adr_byiconno( destination );
  1581.                         
  1582.                             graf_beginmove( srce_tree, srce_adr, destination, dest_adr );
  1583.  
  1584.                             resultat= DataGrp_MergeFile( datagroup );    
  1585.  
  1586.                             break;
  1587.                         }
  1588.                             
  1589.                     }
  1590.                     if ( resultat>1 )
  1591.                     {    /*
  1592.                           * Si le chargement s'est effectu‚ 
  1593.                           */
  1594.                         graf_endmove( srce_tree, n_SrcIcon, srce_adr, destination, dest_adr );
  1595.                     }                
  1596.                     break;
  1597.                 }
  1598.                 
  1599.                 case    DSTARBO:                    /* D‚part: ARBO */
  1600.                 case    DSTPAGES:                /* D‚part: PAGES */
  1601.                 case    DSTDATAS:                /* D‚part: donn‚es */
  1602.                 case    DSTTEXTS:                /* D‚part: textes */
  1603.                 case    DSTPICS:                    /* D‚part: images */
  1604.                 {    /*
  1605.                       * D‚part: un DATAGROUP:
  1606.                      * Num‚ro du datagroup concern‚: 
  1607.                      */
  1608.                     DATAGROUP    *datagroup = dgroup_adr_byiconno( n_SrcIcon );
  1609.                     
  1610.                     /* 
  1611.                      * Etat du groupe: 
  1612.                      */
  1613.                     SSTATE    sstate_dgrp    = dataGroup_getSavState( datagroup );
  1614.  
  1615.                     /*
  1616.                      * Selon la destintaion: 
  1617.                      */
  1618.                     switch ( destination )
  1619.                     {
  1620.                         case    DSTTRASH:        
  1621.                             /* 
  1622.                              * Destination: CORBEILLE 
  1623.                              * RESET du DataGroup:
  1624.                              */
  1625.                             graf_beginmove( srce_tree, srce_adr, destination, dest_adr );
  1626.                             if( DataGrp_Reset( datagroup ) )
  1627.                             {    /*
  1628.                                   * Si on a supprim‚: 
  1629.                                   */
  1630.                                 graf_endmove( srce_tree, n_SrcIcon, srce_adr, destination, dest_adr );
  1631.                             }
  1632.                             else
  1633.                             {    /*
  1634.                                  * D‚s‚lectionne l'ic“ne (source) qu'on vient de traiter : 
  1635.                                   */
  1636.                                 modif_icon( G_selection_adr, n_SrcIcon, n_SrcIcon, NORMAL, TAKE_CTRL );
  1637.                             }
  1638.                             no_selection();
  1639.                             resultat=1;
  1640.                             break;
  1641.                         
  1642.                         case    DSTDISK:        
  1643.                         {    /* 
  1644.                              * Destination: DISQUE 
  1645.                              * Sauvegarde des donn‚es d'un groupe: 
  1646.                              * D‚but effet graphique: 
  1647.                              */    
  1648.                             graf_beginmove( srce_tree, srce_adr, destination, dest_adr );
  1649.                         
  1650.                             /* 
  1651.                              * Si le datagroup n'est pas vierge: 
  1652.                              */
  1653.                             if( sstate_dgrp != SSTATE_EMPTY )
  1654.                             {    /*
  1655.                                  * Sauvegarde: 
  1656.                                  */
  1657.                                 resultat= sauve_DataGroup( dgroup_adr_byiconno( n_SrcIcon ) );    
  1658.                                 
  1659.                                 /* 
  1660.                                  * Fin effet graphique: 
  1661.                                  */
  1662.                                 if ( resultat > 0 )
  1663.                                 {
  1664.                                     graf_endmove( srce_tree, n_SrcIcon, srce_adr, destination, dest_adr );
  1665.                                 }
  1666.                             }
  1667.  
  1668.                             resultat = 1;
  1669.                         }
  1670.                     }            
  1671.                     break;
  1672.                 }
  1673.             }
  1674.             break;
  1675.  
  1676.         case    CLASS_DIR:
  1677.         {    /*
  1678.              * D‚part: un directory de zone de donn‚es 
  1679.              */
  1680.             DATAGROUP *    curr_datagroup = G_selection_adr -> datagroup;
  1681.             DATADIR     *    curr_datadir     = G_selection_adr -> datadir;
  1682.             DATAPAGE     *    pDataPage        = page_adr_byicno( curr_datadir, n_SrcIcon );
  1683.             DATATYPE        data_type        = curr_datagroup -> DataType;        /* Type de donn‚es */
  1684.  
  1685.             if( pDataPage == NULL )
  1686.             {    /*
  1687.                   * Si pas de page associ‚e … l'ic“ne:
  1688.                   */
  1689.                 signale( "Pas de Datapage associ‚e" );
  1690.                 break;
  1691.             }
  1692.  
  1693.             switch ( destination )
  1694.             {
  1695.                 case    DSTDISK:
  1696.                     {    /*
  1697.                          * Sauve page ind‚pendante sur disque:
  1698.                          */
  1699.                         graf_beginmove( srce_tree, srce_adr, destination, dest_adr );
  1700.     
  1701.                         sauve_DataPage( curr_datadir, pDataPage );
  1702.     
  1703.                         resultat=1;
  1704.                     }
  1705.                     break;
  1706.                     
  1707.                 case    DSTTERM:                    /* Destination terminal */
  1708.                     if ( data_type == DTYP_PAGES )
  1709.                     {    /* 
  1710.                          * S'il s'agit de pages ‚cran: 
  1711.                          */
  1712.                         graf_beginmove( srce_tree, srce_adr, destination, dest_adr );
  1713.  
  1714.                         visu_page( pDataPage, NULL );     /* Visu page */
  1715.     
  1716.                         resultat=1;
  1717.                     }
  1718.                     break;
  1719.  
  1720.                 case    DSTTRASH:                /* Destination poubelle! */
  1721.                 {
  1722.                     /*
  1723.                      * Effet graphique: 
  1724.                      */
  1725.                     graf_beginmove( srce_tree, srce_adr, destination, dest_adr );
  1726.  
  1727.                     /* 
  1728.                      * Demande conf et efface: 
  1729.                      */
  1730.                     resultat = ( efface_1data( curr_datadir, pDataPage ) )
  1731.                                     ? 2 : 1;
  1732.  
  1733.                     if ( resultat > 1 )
  1734.                     {    /*
  1735.                           * Si on a confirm‚ la suppression: 
  1736.                           */
  1737.                         /* BoŒte en mouvement: */
  1738.                             graf_movebox(
  1739.                                 srce_adr -> ob_width, srce_adr -> ob_height,                 /* Dimensions boŒte */
  1740.                                 srce_adr -> ob_x + srce_tree -> ob_x, srce_adr -> ob_y + srce_tree -> ob_y,        /* Coord d‚part */
  1741.                                 dest_adr -> ob_x + G_x_mini, dest_adr -> ob_y + G_y_mini );    /* Coord dest */
  1742.         
  1743.                             /*
  1744.                              * Plus d'ic“ne s‚lectionn‚e: 
  1745.                              */
  1746.                             no_selection();
  1747.  
  1748.                             /*
  1749.                              * D‚s‚lectionne destination: 
  1750.                              */
  1751.                             modif_icon( G_desk_params_adr, destination, destination, NORMAL, TAKE_CTRL );
  1752.  
  1753.                     }
  1754.                     break;
  1755.                 }
  1756.             }
  1757.             break;            
  1758.         }
  1759.     }
  1760.  
  1761.  
  1762.     switch( resultat )
  1763.     {
  1764.         case 0:            /* Op impossible */
  1765.             alert( PERR_IMPOSSIBLE_OP );        /* Op‚ration impossible */
  1766.             break;
  1767.             
  1768.         case 1:            /* No comment on operation */
  1769.             /* 
  1770.              *    D‚s‚lectionne destination: 
  1771.              */
  1772.             modif_icon( G_desk_params_adr, destination, destination, NORMAL, TAKE_CTRL );
  1773.             break;
  1774.  
  1775.     }
  1776. }
  1777.  
  1778.  
  1779.  
  1780. /*
  1781.  * graf_beginmove(-)
  1782.  *
  1783.  * Purpose:
  1784.  * --------
  1785.  * D‚but d'un mouvement d'ic“ne
  1786.  *
  1787.  * History:
  1788.  * --------
  1789.  * 1993: fplanque: Created
  1790.  */
  1791. void    graf_beginmove( OBJECT *srce_tree, OBJECT *srce_adr, int destination, OBJECT *dest_adr )
  1792. {
  1793.     /* BoŒte en mouvement: */
  1794.         graf_movebox(
  1795.             srce_adr -> ob_width, srce_adr -> ob_height,                 /* Dimensions boŒte */
  1796.             srce_adr -> ob_x + srce_tree -> ob_x, srce_adr -> ob_y + srce_tree -> ob_y,        /* Coord d‚part */
  1797.             dest_adr -> ob_x + G_x_mini, dest_adr -> ob_y + G_y_mini );    /* Coord dest */
  1798.  
  1799.     /* S‚lectionne destination: */
  1800.             modif_icon( G_desk_params_adr, destination, destination, SELECTED, TAKE_CTRL );
  1801. }
  1802.  
  1803.  
  1804.  
  1805. /*
  1806.  * graf_endmove(-)
  1807.  *
  1808.  * Purpose:
  1809.  * --------
  1810.  * Fin d'un mouvement d'ic“ne complet
  1811.  *
  1812.  * History:
  1813.  * --------
  1814.  * fplanque: Created
  1815.  */
  1816. void    graf_endmove( 
  1817.             OBJECT *srce_tree, 
  1818.             int n_SrcIcon, 
  1819.             OBJECT *srce_adr, 
  1820.             int destination, 
  1821.             OBJECT *dest_adr )
  1822. {
  1823.     /* D‚s‚lectionne l'ic“ne (n_SrcIcon) qu'on vient de traiter : */
  1824.         modif_icon( G_selection_adr, n_SrcIcon, n_SrcIcon, NORMAL, TAKE_CTRL );
  1825.         
  1826.     /* BoŒte en mouvement: */
  1827.         graf_movebox(
  1828.             srce_adr -> ob_width, srce_adr -> ob_height,                 /* Dimensions boŒte */
  1829.             srce_adr -> ob_x + srce_tree -> ob_x, srce_adr -> ob_y + srce_tree -> ob_y,        /* Coord d‚part */
  1830.             dest_adr -> ob_x + G_x_mini, dest_adr -> ob_y + G_y_mini );    /* Coord dest */
  1831.                 
  1832.     /* S‚lectionne ic“ne destination en m‚moire: */
  1833.         G_selection_adr = G_desk_params_adr;
  1834.         G_selection_adr -> selected_icon = destination;
  1835.     /* Disable/enable menu OUVRIR */
  1836.         menu_ienable( G_menu_adr, OUVRIR, ( G_desktop_adr[ destination ] .ob_flags & OUVRABLE ));
  1837. }
  1838.  
  1839.  
  1840.  
  1841.  
  1842. /*
  1843.  * apropos(-)
  1844.  *
  1845.  * Purpose:
  1846.  * --------
  1847.  * Affichage boite d'infos
  1848.  *
  1849.  * History:
  1850.  * --------
  1851.  * 1993:fplanque: Created
  1852.  */
  1853. void apropos( const GRECT *start_box )
  1854. {
  1855.     int        exit_obj;                    /* Objet de sortie */
  1856.     GRECT        form_box;                    /* Dimensions du formulaire */
  1857.     int        edit = 0;                    /* Bidon */
  1858.  
  1859.     /* App prend en charge souris */
  1860.     WIND_UPDATE_BEG_MCTRL
  1861.  
  1862.     open_dialog( M_apropos_adr, start_box, &form_box );
  1863.     
  1864.     exit_obj=ext_form_do( M_apropos_adr, &edit);    /* Gestion de la boŒte */
  1865.  
  1866.     close_dialog( M_apropos_adr, exit_obj, start_box, &form_box );
  1867.  
  1868.     /* AES peut reprendre la souris */
  1869.     WIND_UPDATE_END_MCTRL
  1870. }
  1871.  
  1872.  
  1873.  
  1874.  
  1875.  
  1876.  
  1877. /*
  1878.  * main_quitter(-)
  1879.  *
  1880.  * Purpose:
  1881.  * --------
  1882.  * Appell‚ Lorsque l'utilisateur veut quitter
  1883.  * Ferme les fenetres avec demande de confirmation si contenu modifi‚
  1884.  * Contr“le si tout est sauv‚ et le cas ‚ch‚ant, demande s'il faut sauver
  1885.  * et finalement sauve h‚h‚ :)
  1886.  *
  1887.  * History:
  1888.  * --------
  1889.  * 02.10.94: fplanque: Created
  1890.  * 07.01.95: ferme les fenetres avant de proposer de sauver les groupes, en effet lors de la fermeture d'une fenetre on peut modifier un groupe!
  1891.  */   
  1892. BOOL    main_quitter( void )        /* Out: TRUE si on autorise … quitter */
  1893. {
  1894.     while (G_top_wi_handle != 0)        
  1895.     {    /*
  1896.          * Tant qu'on a une fenˆtre ouverte 
  1897.          * On ferme celle du dessus
  1898.          */
  1899.         if( ! ferme_fenetre( G_wi_list_adr, TRUE_1 ) )
  1900.         {    /*
  1901.              * On ne quitte pas!
  1902.              */
  1903.             return    FALSE0;
  1904.         }
  1905.     }
  1906.  
  1907.     if( get_ServSState() == SSTATE_MODIFIED )
  1908.     {    /*
  1909.          * Le serveur a ‚t‚ modifi‚ depuis derniŠre sauvegarde:
  1910.          */
  1911.         do
  1912.         {
  1913.             switch( alert( DLG_SAVE_QUIT ) )
  1914.             {
  1915.                 case    1:
  1916.                     DataGroups_SaveAll();
  1917.                     break;
  1918.     
  1919.                 case    2:
  1920.                     return    TRUE_1;
  1921.             
  1922.                 case    3:
  1923.                     return    FALSE0;
  1924.             }
  1925.  
  1926.         /*
  1927.          * Si tout n'a pas ‚t‚ sauv‚, on va reposer la question fatidique!
  1928.          */
  1929.  
  1930.         } while ( get_ServSState() == SSTATE_MODIFIED );
  1931.         
  1932.         return    TRUE_1;
  1933.     }
  1934.     else
  1935.     {    /*
  1936.          * Tous les fichiers en RAM sont sauv‚s:
  1937.          */
  1938.         if( alert( DLG_QUIT ) == 1 )
  1939.         {    
  1940.             return    TRUE_1;
  1941.         }
  1942.     }
  1943.  
  1944.     /*
  1945.      * On ne quitte pas!
  1946.      */
  1947.     return    FALSE0;
  1948. }
  1949.  
  1950.  
  1951.  
  1952.